package pe.com.hermes.hermetic.web.controller.reportes;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.beans.CSDenominacionBean;
import pe.com.hermes.hermetic.beans.CSDenominacionTempBean;
import pe.com.hermes.hermetic.beans.ConsolidadoBean;
import pe.com.hermes.hermetic.beans.FormatSaldoTempBean;
import pe.com.hermes.hermetic.beans.SaldoTempBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.web.controller.base.IController;

import pe.com.hermes.hermetic.web.forms.HMF4016Form;

import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;

import java.text.DecimalFormat;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/mostrarHWF4016.html")
public class SaldoConsolidadoController implements IController{
    protected final static Logger logger = Logger.getLogger(BilletesRecontadosController.class);
    @Autowired
    private HermeticFacade servicioHermetic;
    @RequestMapping(method=RequestMethod.GET)    
    protected String showForm(ModelMap model,HttpServletRequest request)throws Exception{
        logger.info(this.getClass().toString()+" "+"metodo: GET");
        HMF4016Form form = new HMF4016Form();
        if(Integer.valueOf((String)request.getSession().getAttribute("cliente")) != ConstantesHermetic.CTE_COD_CLIENTE_INTERBANK)                
            return FORM_CONSTRUCCION_VIEW;
        String fecha = servicioHermetic.getFechaHoy();
        form.setFecha(fecha);
        model.put(FORM_KEY,form);
        AuditBean auditBean = new AuditBean(SALD_CONSOL);
        servicioHermetic.inseAudit(auditBean);
        return FORM_SALD_CONSOL;
    }
    @RequestMapping(params="accion=verExcel")    
    protected String verExcel(ModelMap model,@ModelAttribute(FORM_KEY) HMF4016Form form,BindingResult result,HttpServletRequest request)throws Exception{
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        logger.info(this.getClass().toString()+" "+"verExcel");        
        try{
            cargarConsolidado(form,request);
        }catch(Exception e){
            logger.error(e);
        }
        model.put(FORM_KEY,form);
        return FORM_SALD_CONSOL_REPO;
    }
    private int cargarConsolidado(HMF4016Form actionForm,HttpServletRequest request ) {
        int accionMapa = 1;
        String sucursal = (String)request.getSession().getAttribute("sucursal");
        ConsolidadoBean consolidadoBean = new ConsolidadoBean();
        logger.info(" fecha: " + actionForm.getFecha() + "FIN");
        logger.info(" sucursal: " + sucursal + "FIN");
        consolidadoBean = servicioHermetic.getSaldoConsolidado(sucursal,actionForm.getFecha());
        consolidadoBean = getFormat(consolidadoBean);
        actionForm.setLista_bcr_soles(consolidadoBean.getLista_bcr_soles());        
        actionForm.setLista_euros(consolidadoBean.getLista_euros());
        actionForm.setLista_interbancario_dolares(consolidadoBean.getLista_interbancario_dolares());
        actionForm.setLista_interbancario_soles(consolidadoBean.getLista_interbancario_soles());
        actionForm.setLista_regular_dolares(consolidadoBean.getLista_regular_dolares());
        actionForm.setLista_regular_soles(consolidadoBean.getLista_regular_soles());
        actionForm.setLista_total_soles(consolidadoBean.getLista_total_soles());
        actionForm.setLista_total_dolares(consolidadoBean.getLista_total_dolares());
        logger.info(" total Lista 1: " + consolidadoBean.getLista_bcr_soles().size());
        logger.info(" total Lista 2: " + consolidadoBean.getLista_euros().size());
        logger.info(" total Lista 3: " + consolidadoBean.getLista_interbancario_dolares().size());
        logger.info(" total Lista 4: " + consolidadoBean.getLista_interbancario_soles().size());
        logger.info(" total Lista 5: " + consolidadoBean.getLista_regular_dolares().size());
        logger.info(" total Lista 6: " + consolidadoBean.getLista_regular_soles().size());
        logger.info(" total Lista 7: " + consolidadoBean.getLista_total_dolares().size());
        logger.info(" total Lista 8: " + consolidadoBean.getLista_total_soles().size());
        
        request.setAttribute("fecha",actionForm.getFecha());        
        
        
    return accionMapa;
    }

    private ConsolidadoBean getFormat(ConsolidadoBean consolidadoBean) {
        List formatList = new ArrayList();                
        int tam = consolidadoBean.getLista_bcr_soles().size();
        formatList = getList(consolidadoBean.getLista_bcr_soles(), tam);
        consolidadoBean.setLista_bcr_soles(formatList);
        formatList = getList(consolidadoBean.getLista_euros(), tam);
        consolidadoBean.setLista_euros(formatList);
        formatList = getList(consolidadoBean.getLista_interbancario_dolares(), tam);
        consolidadoBean.setLista_interbancario_dolares(formatList);
        formatList = getList(consolidadoBean.getLista_interbancario_soles(), tam);
        consolidadoBean.setLista_interbancario_soles(formatList);
        formatList = getList(consolidadoBean.getLista_regular_dolares(), tam);
        consolidadoBean.setLista_regular_dolares(formatList);
        formatList = getList(consolidadoBean.getLista_regular_soles(), tam);
        consolidadoBean.setLista_regular_soles(formatList);
        formatList = getListTotal(consolidadoBean.getLista_total_soles(), tam);
        consolidadoBean.setLista_total_soles(formatList);        
        formatList = getListTotal(consolidadoBean.getLista_total_dolares(), tam);
        consolidadoBean.setLista_total_dolares(formatList);
        return consolidadoBean;
    }

    private FormatSaldoTempBean getFormatSaldo(SaldoTempBean saldoTemp) {
        DecimalFormat df = new DecimalFormat("###.#####");
        FormatSaldoTempBean formatSaldo = new FormatSaldoTempBean();
        formatSaldo.setTipo_reporte(saldoTemp.getTipo_reporte());
        formatSaldo.setTipo_moneda(df.format(saldoTemp.getTipo_moneda()));
        formatSaldo.setTipo_deno(saldoTemp.getTipo_deno());
        formatSaldo.setMonto_movimiento(df.format(saldoTemp.getMonto_movimiento()));
        formatSaldo.setMonto_limpios(df.format(saldoTemp.getMonto_limpios()));
        formatSaldo.setMonto_deteriorado(df.format(saldoTemp.getMonto_deteriorado()));
        formatSaldo.setMonto_atm(df.format(saldoTemp.getMonto_atm()));
        formatSaldo.setMonto_cb(df.format(saldoTemp.getMonto_cb()));
        formatSaldo.setMonto_cb_dudoso(df.format(saldoTemp.getMonto_cb_dudoso()));
        formatSaldo.setTotal(df.format(saldoTemp.getTotal()));
        return formatSaldo;
    }

    private List getList(List list, int tam) {
        List formatList = new LinkedList();
        for (int i=0;i<tam;i++){
            SaldoTempBean saldoTemp = new SaldoTempBean();
            FormatSaldoTempBean formatSaldo = new FormatSaldoTempBean();
            saldoTemp = (SaldoTempBean)list.get(i);
            formatSaldo = getFormatSaldo(saldoTemp);
            formatList.add(formatSaldo);
        }
        return formatList;
    }

    private List getListTotal(List list, int tam) {
        List formatList = new LinkedList();
        for (int i=0;i<tam;i++){
            CSDenominacionTempBean denoTemp = new CSDenominacionTempBean();
            CSDenominacionBean formatSaldo = new CSDenominacionBean();
            denoTemp = (CSDenominacionTempBean)list.get(i);
            formatSaldo = getFormatSaldo(denoTemp);
            formatList.add(formatSaldo);
        }
        return formatList;
    
    }

    private CSDenominacionBean getFormatSaldo(CSDenominacionTempBean denoTemp) {
        DecimalFormat df = new DecimalFormat("###.#####");
        CSDenominacionBean formatSaldo = new CSDenominacionBean();
        formatSaldo.setTipoMoneda(denoTemp.getTipoMoneda());
        formatSaldo.setMonto(df.format(denoTemp.getMonto()));
        return formatSaldo;
    }
}    
